// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// http://code.google.com/p/yam2d/
//
// Copyright (c) 2013 Mikko Romppainen
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of
// this software and associated documentation files (the "Software"), to deal in the
// Software without restriction, including without limitation the rights to use, copy,
// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
// and to permit persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies
// or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#ifndef OBJECT_H_
#define OBJECT_H_


#include <es_assert.h>

namespace yam2d
{

/**
 * Object class to be used as base class for each class.
 *
 * Object class provides functionality for internal object reference
 * counting. Refecence counting can be done using addRef and releaseRef
 * methods.
 * 
 * @ingroup yam2d
 * @author Mikko Romppainen (mikko@kajakbros.com)
 */
class Object
{
public:

	/**
	 * Default constructor.
	 * Creates an object and sets ref count to 0.
	 */
	Object();

	/**
	 * Class destructor.
	 */
    virtual ~Object();

	/** 
	 * Increments ref count.
	 */
	inline void addRef()
	{
		assert( m_numOfRefs >= 0 );
		++m_numOfRefs;
	}

	/** 
     * Decrements ref count.
	 * @return Returns current ref count.
	 */
    inline int releaseRef()
	{
		assert( m_numOfRefs > 0 );
		return --m_numOfRefs;
	}

	/**
	 * Returns current ref count.
	 */
	inline int getRefCount() const
	{
		return m_numOfRefs;
	}

private:
	// Member variables
	int m_numOfRefs;

	// Non-allowed methods (declared but not defined anywhere, result link error if used)
	Object( const Object& );
	Object& operator=( const Object& );
};


}



#endif // OBJECT_H_


